Shell脚本和Bat脚本学习

您所在的位置:网站首页 linux shell 取余 Shell脚本和Bat脚本学习

Shell脚本和Bat脚本学习

#Shell脚本和Bat脚本学习| 来源: 网络整理| 查看: 265

1.脚本对应环境 1.shell环境

主要用在linux中,而linux系统对应的shell又有很多,如Bourne Shell(/usr/bin/sh或/bin/sh),又如Bourne Again Shell(/bin/bash) 由于Bourne Again Shell(/bin/bash)免费且易用,故使用较多。 对应的脚本文件后缀名为.sh。 注:

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。如#!/bin/sh,#!/bin/bash,通常放于脚本文件首行。 2.bat环境

主要用于windows中,又名批处理文件,其每一行指令都是一条dos指令,对应脚本文件后缀名为.bat或者.cmd。

2.脚本执行 1.shell执行 1.直接在bash命令窗口执行shell相关命令。 2.将shell命令保存为文件,执行文件就可以运行shell命令。 注:由于在linux中对文件的权限管理较细,故如果使用shell脚本文件,必须使其具有可执行权限,对脚本授权chmod +x ./文件名.sh #使脚本具有执行权限,执行脚本./test.sh #执行脚本,./必须加,因为当前文件没有加入到linux的path中,linux仅只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 path中。 2.bat脚本执行 1.直接在windows的dos窗口即cmd窗口执行bat相关命令。 2.将bat命令保存为bat文件,在windows中文件权限限制没有linux中那么严格,故相关bat脚本文件可以直接双击执行或者命令行执行。 3.脚本相关命令 1.shell命令 1.shell变量 #!/bin/bash # 定义变量如下,变量名和等号之间不能有空格 name="变量定义" # 变量使用,使用一个定义过的变量,只要在变量名前面加美元符号即可 echo $name # 变量外面的花括号是为了区分边界,加不加都可以 echo ${name} # $只在使用变量的时候加,再次赋值不加 #使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 name="哈哈哈" readonly name name="修改只读变量" # 报错/bin/sh: NAME: This variable is read only. # 使用 unset 命令可以删除变量,变量被删除后不能再次使用,unset 命令不能删除只读变量。 name="旺旺旺" unset name # 删除name变量 echo ${name} # 无输出 # 字符串可以使用单引号'',也可以使用双引号"",也可以不用引号 # 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的,可以用作字符串拼接使用 # 双引号里可以有变量,也可以出现转义字符 name_one='单引号' name_one_p='单引号拼接,'${name_one}'拼接结束' echo ${name_one_p} # 输出:单引号拼接,单引号拼接结束 name_two="双引号" name_two_p1="双引号拼接1,${name_two}拼接结束" name_two_p2="双引号拼接2,"${name_two}"拼接结束" echo ${name_two_p1} ${name_two_p2} #输出:双引号拼接1,双引号拼接结束 双引号拼接2,双引号拼接结束 # 获取字符串长度,变量为数组时,${#arr} 等价于 ${#arr[0]} name="哈哈哈" echo ${#name} # 输出:3 # 提取子字符串,从第4个字符开始提取2个字符(第一个字符的索引值为 0) name="小不点最爱喝兽奶" echo ${name:3:2} # 输出:最爱 # 查找子字符串,查找字符'奶'或'爱'的位置(哪个字母先出现就计算哪个)。这个查找中文有点瑕渍,应该是字符编码问题。 name="wafenhicfsr" echo `expr index "${name}" cf` # 输出:3 # 数组:bash支持一维数组(不支持多维数组),并且没有限定数组的大小。 # 定义数组:用括号来表示数组,数组元素用"空格"符号分割开 arr=(v1 v2 v3 ... vn) arr=( lily 汤姆 123 ) arr[0]=哈哈哈 # 单独定义数组的各个分量 arr[2]="123" arr[n]="nnn" # 可以不使用连续的下标,而且下标的范围没有限制。 # 读取数组格式 ${数组名[下标]} arr=(lily 汤姆 123) echo ${arr[1]} # 输出:汤姆 # 使用 @ 符号可以获取数组中的所有元素 echo ${arr[@]} # 输出:lily 汤姆 123 # 获取数组的长度 echo ${#arr[@]} # 取得数组元素的个数 echo ${#arr[*]} # 取得数组元素的个数 echo ${#arr[1]} # 取得数组单个元素的长度 # 注释,常用的都是以#为注释 :脚本中以$n获取参数, $0 为执行的文件名(包含文件路径),$1接受第一个参数,$2第二个参数...,以此类推 # 文件名./test.sh #!/bin/bash echo "shell传参脚本学习" echo "执行的文件名:$0" echo "第一个参数:$1" echo "第二个参数:$2" echo "第三个参数:$3" echo "传递到脚本的参数个数:$#" echo "以\"1参 2参 3参 n参\"的形式输出所有参数:$*" echo "脚本运行的当前进程ID号:$$" echo "后台运行的最后一个进程的ID号:$!" echo "与\$*相同,但是使用时加引号,并在引号中返回每个参数:$@" echo "显示Shell使用的当前选项:$-" echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误:$?"

修改test.sh文件为可执行:chmod -x test.sh 执行test.sh文件:./test.sh 12 哈哈哈 fggg 执行结果如图:

image.png 3.shell数组 Bash Shell 只支持一维数组(不支持多维数组),且各值以空格分开 # 1.普通数组 arr_ordinary=("lily" 123 "哈哈哈") # 定义 echo ${arr_ordinary[1]} # 访问 # 2.关联数组(与Map类似):可以使用任意的字符串、或者整数作为下标来访问数组元素。 # 语法:declare -A array_name, -A 选项就是用于声明一个关联数组。 declare -A arr_correlation=(["name"]="lily" ["age"]=18 ["sex"]="男") # 也可以先声明一个关联数组,然后再设置键和值 declare -A arr_declare arr_declare["name"]="lily" arr_declare["age"]=18 arr_declare["sex"]="男" # 使用键来访问数组 echo ${arr_declare["name"]} # 获取数组中所有元素,使用 @ 或 * 可以获取数组中的所有元素 echo "数组的值为: ${arr_declare[*]}" echo "数组的值为: ${arr_declare[@]}" # 相当于map中获取所有值value echo "数组的键为: ${!arr_declare[*]}" echo "数组的键为: ${!arr_declare[@]}" # 相当于map中获取所有键 echo "数组元素个数为: ${#my_array[*]}" echo "数组元素个数为: ${#my_array[@]}" 4.shell运算符

1.算术运算符

a1=6 a2=2 # 1.加,+ echo `expr $a1 + $a2` # 输出8 # 2.减,- echo `expr $a1 - $a2` # 输出4 # 3.乘,* echo `expr $a1 \* $a2` # 输出12,乘法的*前面必须加\ # 4.除,/ echo `expr $a1 / $a2` # 输出3 # 5.取余,% echo `expr $a1 % $a2` # 输出0 # 6.赋值,= a1=$a2 # 将变量a2的值赋给a1 # 7.相等,==,比较两个数字相等返回true [ $a1 == $a2 ] # 不能echo,不能直接使用,必须配合if或者test使用 # 8.不相等,!=,比较两个数字不相等返回true [ $a1 != $a2 ]

2.关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 且不能直接使用,只能配合if或者test使用

a1=2 a2=4 # 检测两个数是否相等,相等返回 true [ $a1 -eq $a2 ] # 返回false # 检测两个数是否不相等,不相等返回 true [ $a1 -ne $a2 ] # 返回 true # 检测左边的数是否大于右边的,如果是,则返回 true [ $a1 -gt $a2 ] # 返回false # 检测左边的数是否小于右边的,如果是,则返回 true [ $a1 -lt $a2 ] #返回 true # 检测左边的数是否大于等于右边的,如果是,则返回 true [ $a1 -ge $a2 ] #返回 false # 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a1 -le $a2 ] #返回 true

3.布尔运算符

a1=2 a2=4 # 非运算(!),表达式为 true 则返回 false,否则返回 true [ ! false ] # 返回 true # 或运算(-o),有一个表达式为 true 则返回 true [ $a1 -lt 2 -o $a2 -gt 4 ] 返回 false # 与运算(-a),两个表达式都为 true 才返回 true [ $a1 -lt 2 -a $a2 -gt 4] 返回 false

4.逻辑运算符

a1=2 a2=4 # 逻辑的 AND(&&) [[ $a -lt 4 && $b -gt 5]] # 返回 false # 逻辑的 OR(||) [[ $a -lt 4 || $b -gt 5]] # 返回 true

5.字符串运算符

a1="hhh" a2="ggg" # (=)检测两个字符串是否相等,相等返回 true [ $a1 = $a2 ] # 返回 false # (!=)检测两个字符串是否不相等,不相等返回 true [ $a1 != $a2 ] # 返回 true # (-z)检测字符串长度是否为0,为0返回 true [ -z $a ] # 返回 false # (-n)检测字符串长度是否不为 0,不为 0 返回 true [ -n "$a" ] # 返回 true # ($)检测字符串是否不为空,不为空返回 true [ $a ] # 返回 true

5.shell输出语句

1.echo:输出字符串,一般使用情况 2.printf:格式化输出字符串,功能更强,类似于c语言的输出 语法为:printf format-string [arguments...] 如:printf "%-10s %-8s %-5d\n" 姓名 性别 年龄

6.test命令

# 代码中的 [] 执行基本的算数运算 num1=100 num2=100 if test $[num1] -eq $[num2] # 测出test后面的语句看shell相关运算符 then echo '两个数相等!' else echo '两个数不相等!' fi 7.流程控制语句 1.if语句 # 语法如下 if condition then command1 command2 ... commandN fi # 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

2.if-else语句

# 语法如下 if condition then command1 command2 ... commandN else command fi

3.if-else-if-else语句 注:如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和

file # 将输入重定向到 file command < file # 将输出以追加的方式重定向到 file command >> file # 将文件描述符为 n 的文件重定向到 file n > file # 将文件描述符为 n 的文件以追加的方式重定向到 file n >> file # 将输出文件 m 和 n 合并 n >& m # 将输入文件 m 和 n 合并 n >file # 将输出流stdout 和错误流 stderr 合并后重定向到 file command > file 2>&1 # 追加方式 command >> file 2>&1

另:/dev/null 文件

# /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到 # 将命令的输出重定向到它,会起到"禁止输出"的效果 # 如果希望执行某个命令,但又不希望在屏幕上显示输出结果 command > /dev/null # 如果希望屏蔽 stdout 和 stderr command > /dev/null 2>&1 2.bat命令

bat相关命令和shell命令有异曲同工之妙,而且bat会比shell使用简单点

1.获取和设置相关变量 # 获取常用变量不需要区分大小写,使用%variable%可以获取变量值 # 获取当前目录 echo %cd% # 获取命令搜索路径 echo %path% # 获取当前日期 echo %date% # 格式:2023/03/22 周三 # 获取当前时间 echo %time% # 格式:14:26:46.97 # 获取 0 和 32767 之间的任意十进制数字 echo %random% # 获取上一命令执行结果码 echo %errorlevel% # 变量设置,与shell有所不同,格式如下 set [variable=[string]] #variable表示变量名,string表示变量值 # 例 set temp="哇哈哈" echo %temp% # 输出:"哇哈哈" 2.字符串操作 # 字符串截取,命令格式 echo %var:~n,k%, # 1."var",表示待截取字符的字符串 # 2."~"取字符标志符 # 3."n"表示字符截取起始位置 # 4."k" 表示截取几位 set temp="wahaha哇哈哈123" echo %temp:~2,3% # 输出:hah echo %temp:~0,-3% # 输出:wahaha哇哈哈 # 字符串替换,命令格式命令%var:old_str=new_str% set replace_str=%temp:123=熏悟空% echo %replace_str% # 输出:wahaha哇哈哈熏悟空 echo %temp% # 输出:wahaha哇哈哈123,不改变原值 3.bat注释 rem 注释符,也可以用两个冒号代替(::) rem 这是一个注释,此注释不会显示 4.bat输出语句 echo 显示信息,或启用或关闭命令回显。@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态 # 批处理命令在执行时显示自身命令行 echo on # 批处理命令在执行时不显示自身命令行 echo off # 关闭echo off命令行自身的显示 @echo off # 创建包含字符test的test.txt文件 echo test > file.txt 5.基本命令 # 暂停并输出“请按任意键继续. . .” pause 等待并提示"请按任意键继续. . ." # 阻塞窗口,程序执行完以后不会关闭窗口 pause > nul # 等待但不出现提示语 echo wait a moment.. & pause > nul # 输出指定信息并阻塞窗口 # 程序执行结果返回码,执行成功返回0,失败返回为1 echo %errorlevel% # 启动一个单独的窗口以运行指定的程序或命令,程序继续向下执行 start [command/program] [parameters] # 退出CMD.EXE程序或当前批处理脚本 # 1./B:指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE # 2.exitCode:指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码 exit [/B] [exitCode] # 清除屏幕内容 cls # 提供 Windows 命令的帮助信息 help [command] # 设置cmd窗口的标题 title 标题名字 # 设置默认的控制台前景和背景颜色 # 颜色属性由两个十六进制数字指定:第一个为背景,第二个则为前景 # 以下任意俩种颜色组合 # 0 = 黑色 8 = 灰色 # 1 = 蓝色 9 = 淡蓝色 # 2 = 绿色 A = 淡绿色 # 3 = 湖蓝色 B = 淡浅绿色 # 4 = 红色 C = 淡红色 # 5 = 紫色 D = 淡紫色 # 6 = 黄色 E = 淡黄色 # 7 = 白色 F = 亮白色 color [attr] # attr 指定控制台输出的颜色属性 # 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序 call 路径文件名 标签 # 跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序 goto label # label是参数,指定所要转向的批处理程序中的行 # 例子,打开多个cmd窗口直到资源耗尽 :label start goto label 6.语句结构 1.if语句 # if语句实现条件判断,包括字符串比较、存在判断、定义判断等。# # 通过条件判断,if语句即可以实现选择功能。 /* 1.字符串比较 语法格式:if [/i] [not] str1 比较操作符 str2 (相关操作) [else (相关操作)] 有/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非 比较操作符: 1.== - 等于 2.EQU - 等于 3.NEQ - 不等于 4.LSS - 小于 5.LEQ - 小于或等于 6.GTR - 大于 7.GEQ - 大于或等于 */ # 例子 set str1=123456 set str2=abcdef if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!) if /i not %str1%==%str2% (echo 字符串不相同!) else (echo 字符串相同!) /* 2.存在判断:存在判断的功能是判断文件或文件夹是否存在 语法格式:if [not] exist filename (相关操作) [else (相关操作)] */ # 例子1 if exist %0 echo 文件%0是存在的! # %0代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型) # 例子2 if not exist %0( echo 文件夹%0不存在! )else echo 文件夹%0存在! /* 3.定义判断:定义判断的功能是判断变量是否存在,即是否已被定义 语法格式:if [not] defined variable (相关操作) [else(相关操作)] */ # 例子1 set var=111 if defined var (echo var=%var%) else echo var尚未定义! # 例子2 set var=% % if defined var (echo var=%var%) else echo var尚未定义!

2.for循环语句

/* 1.无开关:无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句 语法格式:for %%v in (循环值values) do (相关操作) 相关解释: %%v是批处理程序里面的书写格式,注意v只能是单字符。在DOS中书写为%v,即只有一个百分号(%);values就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的(相关操作)就是循环所执行的命令,即循环体 */ # 例子1(在脚本文件中) for %%i in (a,"b c",d,123) do echo %%i # 例子2(在dos或者cmd窗口中) for %i in (a,"b c",d,123) do echo %i /* 2.开关/L:开关/L的for语句,可以根据循环值velues里面的设置进行循环,从而实现对循环次数的直接控制 语法格式:for /L %%v in (start,step,end) do (相关操作) 相关解释: start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。 */ # 例子1,打印1到10(小于10)步长为2的数字 for /l %%i in (1,2,10) do @echo %%i # 例子2(在dos或者cmd窗口使用) for /l %i in (1,2,10) do @echo %i /* 3.开关/f:开关/f的for语句可以解析字符串和文本 语法格式:for /f ["options"] %%v in (循环值values) do (相关操作) 相关解释: options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。 */ /* 4.开关/D或/R:开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹 */ 4.总结

上述相关命令已经满足大部分使用情况,更深的需要细细钻研,这些脚本可以处理一些重复的问题,了解相关操作也是必备的学习。如果项目在windows上,那么可以学习一下bat批处理,如果项目在linux上,那么就学习shell相关操作。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3